package com.guigu.eduservice.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jws;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.util.StringUtils;

import javax.servlet.http.HttpServletRequest;
import java.util.Date;

/**
 * @author janecraft
 * @since 2019/10/16
 */
public class EmployeeJwtUtils {

    /**
     * token过期时间
     */
    public static final long EXPIRE = 1000 * 60 * 60 * 24;
    /**
     * 秘钥
     */
    public static final String APP_SECRET = "ukc8BDbRigUDaY6pZFfWus2jZWLPHO";

    /**
     * 生成token字符串的方法
     *
     * @param id，认证成功的account_id
     * @param name，认证成功的account的name
     * @param userType，认证成功的account的userType
     * @return
     */
    public static String getJwtToken(Long id, String name, String userType) {

        String JwtToken = Jwts.builder()
                // 第一部分：JWT头部
                .setHeaderParam("typ", "JWT")
                .setHeaderParam("alg", "HS256")

                // 第二部分：默认字段
                .setSubject("user")
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + EXPIRE))
                // 第二部分：自定义字段
                .claim("id", id)  // 设置token主体部分 ，存储用户信息
                .claim("userName", name)
                .claim("userType", userType)

                // 第三部分：签名哈希
                .signWith(SignatureAlgorithm.HS256, APP_SECRET)
                .compact();
        return JwtToken;
    }

    /**
     * 判断token是否存在与有效
     *
     * @param jwtToken
     * @return
     */
    public static boolean checkToken(String jwtToken) {
        if (StringUtils.isEmpty(jwtToken)) return false;
        try {
            Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(jwtToken);
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }

    /**
     * 判断token是否存在与有效
     *
     * @param request
     * @return
     */
    public static boolean checkToken(HttpServletRequest request) {
        try {
            // token的携带方式，随请求头部
            // token在请求头部的键，X-Token
            String jwtToken = request.getHeader("X-Token");
            if (StringUtils.isEmpty(jwtToken)) return false;
            Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(jwtToken);
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }

    /**
     * 根据token字符串获取登录帐号id
     *
     * @param request
     * @return
     */
    public static int getUserIDByJwtToken(HttpServletRequest request) {
        String jwtToken = request.getHeader("X-Token");
        if (StringUtils.isEmpty(jwtToken)) return  0;
        Jws<Claims> claimsJws = Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(jwtToken);
        Claims claims = claimsJws.getBody();
        return (int) claims.get("id");
    }

    /**
     * 根据token字符串获取登录帐号用户名
     *
     * @param request
     * @return
     */
    public static String getUserNameByJwtToken(HttpServletRequest request) {
        String jwtToken = request.getHeader("X-Token");
        if (StringUtils.isEmpty(jwtToken)) return "";
        Jws<Claims> claimsJws = Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(jwtToken);
        Claims claims = claimsJws.getBody();
        return (String) claims.get("userName");
    }
    /**
     * 根据token字符串获取登录帐号用户类型
     *
     * @param request
     * @return
     */
    public static String getUserTypeByJwtToken(HttpServletRequest request) {
        String jwtToken = request.getHeader("X-Token");
        if (StringUtils.isEmpty(jwtToken)) return "";
        Jws<Claims> claimsJws = Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(jwtToken);
        Claims claims = claimsJws.getBody();
        return (String) claims.get("userType");
    }
}